<?php
    /**
     * Created by PhpStorm.
     * User: mybook-lhp
     * Date: 18/2/6
     * Time: 上午10:03
     */

    namespace app\common\utils;

    /**
     * /*
     * $file = new file();
     * $file_path = 'C:/Documents and Settings/Administrator/桌面/phpThumb_1.7.10-201104242100-beta';
     * $files = 'C:/Documents and Settings/Administrator/桌面/phpThumb_1.7.10-201104242100-beta/index.php';
     * $create_path = 'D:/这是创建的目录/哈哈/爱/的/味道/是/雪儿/给的/';
     * echo '创建文件夹:create_dir()<br>';
     * //if($file->create_dir($create_path)) echo '创建目录成功'; else '创建目录失败';
     * echo '<hr>创建文件:create_file()<br>';
     * //if($file->create_file($create_path.'创建的文件.txt',true,strtotime('1988-05-04'),strtotime('1988-05-04'))) echo
     * '创建文件成功!'; else echo '创建文件失败!'; echo '<hr>删除非空目录:remove_dir()<br>';
     * //if($file->remove_dir($file_path,true)) echo '删除非空目录成功!'; else echo '删除非空目录失败!';
     * echo '<hr>取得文件完整名称(带后缀名):get_basename()<br>';
     * //echo $file->get_basename($files);
     * echo '<hr>取得文件后缀名:get_ext()<br>';
     * //echo $file->get_ext($files);
     * echo '<hr>取得上N级目录:father_dir()<br>';
     * //echo $file->father_dir($file_path,3);
     * echo '<hr>删除文件:unlink_file()<br>';
     * //if($file->unlink_file($file_path.'/index.php')) echo '删除文件成功!'; else '删除文件失败!';
     * echo '<hr>操作文件:handle_file()<br>';
     * //if($file->handle_file($file_path.'/index.php',$create_path.'/index.php','copy',true)) echo '复制文件成功!'; else
     * echo '复制文件失败!';
     * //if($file->handle_file($file_path.'/index.php', $create_path.'/index.php','move',true)) echo '文件移动成功!'; else
     * echo '文件移动失败!'; echo '<hr>操作文件夹:handle_dir()<br>';
     * //if($file->handle_dir($file_path,$create_path,'copy',true)) echo '复制文件夹成功!'; else echo '复制文件夹失败!';
     * //if($file->handle_dir($file_path,$create_path,'move',true)) echo '移动文件夹成功!'; else echo '移动文件夹失败!';
     * echo '<hr>取得文件夹信息:get_dir_info()<br>';
     * //print_r($file->get_dir_info($create_path));
     * echo '<hr>替换统一格式路径:dir_replace()<br>';
     * //echo $file->dir_replace("c:\d/d\e/d\h");
     * echo '<hr>取得指定模板文件:get_templtes()<br>';
     * //echo $file->get_templtes($create_path.'/index.php');
     * echo '<hr>取得指定条件的文件夹中的文件:list_dir_info()<br>';
     * //print_r($file->list_dir_info($create_path,true));
     * echo '<hr>取得文件夹信息:dir_info()<br>';
     * //print_r($file->dir_info($create_path));
     * echo '<hr>判断文件夹是否为空:is_empty()<br>';
     * //if($file->is_empty($create_path)) echo '不为空'; else echo'为空';
     * echo '<hr>返回指定文件和目录的信息:list_info()<br>';
     * //print_r($file->list_info($create_path));
     * echo '<hr>返回关于打开文件的信息:open_info()<br>';
     * //print_r($file->open_info($create_path.'/index.php'));
     * echo '<hr>取得文件路径信息:get_file_type()<br>';
     * //print_r($file->get_file_type($create_path));
     * */

    /**
     * Class UtilFiles
     *
     * @package app\common\Utils
     */
    class UtilFiles
    {

        static protected $Instance = null;

        /**
         * 单例模式实例
         *
         * @return null
         */
        static public function Instance()
        {

            if (static::$Instance == null)
            {
                static::$Instance = new static();
            }

            return static::$Instance;
        }

        /**
         * 创建多级目录
         * 目录不存在则自动创建
         *
         * @param string $dir
         * @param int    $mode
         *
         * @return boolean
         */
        public function create_dir($dir,$mode = 0777)
        {

            return is_dir($dir) or ($this->create_dir(dirname($dir)) and mkdir($dir,$mode));
        }

        /**
         * 创建指定路径下的指定文件
         *
         * @param string  $path       (需要包含文件名和后缀)
         * @param boolean $over_write 是否覆盖文件
         * @param int     $time       设置时间。默认是当前系统时间
         * @param int     $atime      设置访问时间。默认是当前系统时间
         *
         * @return boolean
         */
        public function create_file($path,$over_write = FALSE,$time = NULL,$atime = NULL)
        {

            $path  = $this->dir_replace($path);
            $time  = empty($time) ? time() : $time;
            $atime = empty($atime) ? time() : $atime;
            if (file_exists($path) && $over_write)
            {
                $this->unlink_file($path);
            }
            $aimDir = dirname($path);
            $this->create_dir($aimDir);
            return touch($path,$time,$atime);
        }

        /**
         * 关闭文件操作
         *
         * @param string $path
         *
         * @return boolean
         */
        public function close($path)
        {

            return fclose($path);
        }

        /**
         * 读取文件操作
         *
         * @param string $file
         *
         * @return boolean
         */
        public function read_file($file)
        {

            return @file_get_contents($file);
        }

        /**
         * 确定服务器的最大上传限制（字节数）
         *
         * @return int 服务器允许的最大上传字节数
         */
        public function allow_upload_size()
        {

            $val = trim(ini_get('upload_max_filesize'));
            return $val;
        }

        /**
         * 字节格式化 把字节数格式为 B K M G T P E Z Y 描述的大小
         *
         * @param int $size 大小
         * @param int $dec  显示类型
         *
         * @return int
         */
        public function byte_format($size,$dec = 2)
        {

            $a   = ["B","KB","MB","GB","TB","PB","EB","ZB","YB"];
            $pos = 0;
            while ($size >= 1024)
            {
                $size /= 1024;
                $pos++;
            }
            return round($size,$dec) . " " . $a[$pos];
        }

        /**
         * 删除非空目录
         * 说明:只能删除非系统和特定权限的文件,否则会出现错误
         *
         * @param string  $dirName 目录路径
         * @param boolean $is_all  是否删除所有
         * @param boolean $del_dir 是否删除目录
         *
         * @return boolean
         */
        public function remove_dir($dir_path,$is_all = FALSE)
        {

            $dirName = $this->dir_replace($dir_path);
            $handle  = @opendir($dirName);
            while (($file = @readdir($handle)) !== FALSE)
            {
                if ($file != '.' && $file != '..')
                {
                    $dir = $dirName . '/' . $file;
                    if ($is_all)
                    {
                        is_dir($dir) ? $this->remove_dir($dir) : $this->unlink_file($dir);
                    }
                    else
                    {
                        if (is_file($dir))
                        {
                            $this->unlink_file($dir);
                        }
                    }
                }
            }
            closedir($handle);
            return @rmdir($dirName);
        }

        /**
         * 获取完整文件名
         *
         * @param string $fn 路径
         *
         * @return string
         */
        public function get_basename($file_path)
        {

            $file_path = $this->dir_replace($file_path);
            return basename(str_replace('\\','/',$file_path));
            //return pathinfo($file_path,PATHINFO_BASENAME);
        }

        /**
         * 获取文件后缀名
         *
         * @param string $file_name 文件路径
         *
         * @return string
         */
        public function get_ext($file)
        {

            $file = $this->dir_replace($file);
            //return strtolower(substr(strrchr(basename($file), '.'),1));
            //return end(explode(".",$filename ));
            //return strtolower(trim(array_pop(explode('.', $file))));//取得后缀
            //return preg_replace('/.*\.(.*[^\.].*)*/iU','\\1',$file);
            return pathinfo($file,PATHINFO_EXTENSION);
        }

        /**
         * 取得指定目录名称
         *
         * @param string $path 文件路径
         * @param int    $num  需要返回以上级目录的数
         *
         * @return string
         */
        public function father_dir($path,$num = 1)
        {

            $path = $this->dir_replace($path);
            $arr  = explode('/',$path);
            if ($num == 0 || count($arr) < $num)
                return pathinfo($path,PATHINFO_BASENAME);
            return substr(strrev($path),0,1) == '/' ? $arr[(count($arr) - (1 + $num))] : $arr[(count($arr) - $num)];
        }

        /**
         * 删除文件
         *
         * @param string $path
         *
         * @return boolean
         */
        public function unlink_file($path)
        {

            $path = $this->dir_replace($path);
            if (file_exists($path))
            {
                return unlink($path);
            }
        }

        /**
         * 文件操作(复制/移动)
         *
         * @param string  $old_path  指定要操作文件路径(需要含有文件名和后缀名)
         * @param string  $new_path  指定新文件路径（需要新的文件名和后缀名）
         * @param string  $type      文件操作类型
         * @param boolean $overWrite 是否覆盖已存在文件
         *
         * @return boolean
         */
        public function handle_file($old_path,$new_path,$type = 'copy',$overWrite = FALSE)
        {

            $old_path = $this->dir_replace($old_path);
            $new_path = $this->dir_replace($new_path);
            if (file_exists($new_path) && $overWrite = FALSE)
            {
                return FALSE;
            }
            else if (file_exists($new_path) && $overWrite = TRUE)
            {
                $this->unlink_file($new_path);
            }

            $aimDir = dirname($new_path);
            $this->create_dir($aimDir);
            switch($type)
            {
                case 'copy':
                    return copy($old_path,$new_path);
                    break;
                case 'move':
                    return rename($old_path,$new_path);
                    break;
            }
        }

        /**
         * 文件夹操作(复制/移动)
         *
         * @param string  $old_path  指定要操作文件夹路径
         * @param string  $aimDir    指定新文件夹路径
         * @param string  $type      操作类型
         * @param boolean $overWrite 是否覆盖文件和文件夹
         *
         * @return boolean
         */
        public function handle_dir($old_path,$new_path,$type = 'copy',$overWrite = FALSE)
        {

            $new_path = $this->check_path($new_path);
            $old_path = $this->check_path($old_path);
            if (!is_dir($old_path))
                return FALSE;

            if (!file_exists($new_path))
                $this->create_dir($new_path);

            $dirHandle = opendir($old_path);

            if (!$dirHandle)
                return FALSE;

            $boolean = TRUE;

            while (FALSE !== ($file = readdir($dirHandle)))
            {
                if ($file == '.' || $file == '..')
                    continue;

                if (!is_dir($old_path . $file))
                {
                    $boolean = $this->handle_file($old_path . $file,$new_path . $file,$type,$overWrite);
                }
                else
                {
                    $this->handle_dir($old_path . $file,$new_path . $file,$type,$overWrite);
                }
            }
            switch($type)
            {
                case 'copy':
                    closedir($dirHandle);
                    return $boolean;
                    break;
                case 'move':
                    closedir($dirHandle);
                    return rmdir($old_path);
                    break;
            }
        }

        /**
         * 替换相应的字符
         *
         * @param string $path 路径
         *
         * @return string
         */
        public function dir_replace($path)
        {

            return str_replace('//','/',str_replace('\\','/',$path));
        }

        /**
         * 读取指定路径下模板文件
         *
         * @param string $path 指定路径下的文件
         *
         * @return string $rstr
         */
        public function get_templtes($path)
        {

            $path = $this->dir_replace($path);
            if (file_exists($path))
            {
                $fp   = fopen($path,'r');
                $rstr = fread($fp,filesize($path));
                fclose($fp);
                return $rstr;
            }
            else
            {
                return '';
            }
        }

        /**
         * 文件重命名
         *
         * @param string $oldname
         * @param string $newname
         */
        public function rename($oldname,$newname)
        {

            if (($newname != $oldname) && is_writable($oldname))
            {
                return rename($oldname,$newname);
            }
        }

        /**
         * 获取指定路径下的信息
         *
         * @param string $dir 路径
         *
         * @return ArrayObject
         */
        public function get_dir_info($dir)
        {

            $handle          = @opendir($dir);//打开指定目录
            $directory_count = 0;
            $total_size      = 0;
            $file_cout       = 0;
            while (FALSE !== ($file_path = readdir($handle)))
            {
                if ($file_path != "." && $file_path != "..")
                {
                    //is_dir("$dir/$file_path") ? $sizeResult += $this->get_dir_size("$dir/$file_path") : $sizeResult += filesize("$dir/$file_path");
                    $next_path = $dir . '/' . $file_path;
                    if (is_dir($next_path))
                    {
                        $directory_count++;
                        $result_value    = self::get_dir_info($next_path);
                        $total_size      += $result_value['size'];
                        $file_cout       += $result_value['filecount'];
                        $directory_count += $result_value['dircount'];
                    }
                    elseif (is_file($next_path))
                    {
                        $total_size += filesize($next_path);
                        $file_cout++;
                    }
                }
            }
            closedir($handle);//关闭指定目录
            $result_value['size']      = $total_size;
            $result_value['filecount'] = $file_cout;
            $result_value['dircount']  = $directory_count;
            return $result_value;
        }

        /**
         * 指定文件编码转换
         *
         * @param string $path       文件路径
         * @param string $input_code 原始编码
         * @param string $out_code   输出编码
         *
         * @return boolean
         */
        public function change_file_code($path,$input_code,$out_code)
        {

            if (is_file($path))//检查文件是否存在,如果存在就执行转码,返回真
            {
                $content = file_get_contents($path);
                $content = string::chang_code($content,$input_code,$out_code);
                $fp      = fopen($path,'w');
                return fputs($fp,$content) ? TRUE : FALSE;
                fclose($fp);
            }
        }

        /**
         * 指定目录下指定条件文件编码转换
         *
         * @param string  $dirname    目录路径
         * @param string  $input_code 原始编码
         * @param string  $out_code   输出编码
         * @param boolean $is_all     是否转换所有子目录下文件编码
         * @param string  $exts       文件类型
         *
         * @return boolean
         */
        public function change_dir_files_code($dirname,$input_code,$out_code,$is_all = TRUE,$exts = '')
        {

            if (is_dir($dirname))
            {
                $fh = opendir($dirname);
                while (($file = readdir($fh)) !== FALSE)
                {
                    if (strcmp($file,'.') == 0 || strcmp($file,'..') == 0)
                    {
                        continue;
                    }
                    $filepath = $dirname . '/' . $file;

                    if (is_dir($filepath) && $is_all == TRUE)
                    {
                        $files = $this->change_dir_files_code($filepath,$input_code,$out_code,$is_all,$exts);
                    }
                    else
                    {
                        if ($this->get_ext($filepath) == $exts && is_file($filepath))
                        {
                            $boole = $this->change_file_code($filepath,$input_code,$out_code,$is_all,$exts);
                            if (!$boole)
                                continue;
                        }
                    }
                }
                closedir($fh);
                return TRUE;
            }
            else
            {
                return FALSE;
            }
        }

        /**
         * 列出指定目录下符合条件的文件和文件夹
         *
         * @param string  $dirname 路径
         * @param boolean $is_all  是否列出子目录中的文件
         * @param string  $exts    需要列出的后缀名文件
         * @param string  $sort    数组排序
         *
         * @return ArrayObject
         */
        public function list_dir_info($dirname,$is_all = FALSE,$exts = '',$sort = 'ASC')
        {

            //处理多于的/号
            $new = strrev($dirname);
            if (strpos($new,'/') == 0)
            {
                $new = substr($new,1);
            }
            $dirname = strrev($new);

            $sort = strtolower($sort);//将字符转换成小写

            $files    = [];
            $subfiles = [];

            if (is_dir($dirname))
            {
                $fh = opendir($dirname);
                while (($file = readdir($fh)) !== FALSE)
                {
                    if (strcmp($file,'.') == 0 || strcmp($file,'..') == 0)
                        continue;

                    $filepath = $dirname . '/' . $file;

                    switch($exts)
                    {
                        case '*':
                            if (is_dir($filepath) && $is_all == TRUE)
                            {
                                $files = array_merge($files,self::list_dir_info($filepath,$is_all,$exts,$sort));
                            }
                            array_push($files,$filepath);
                            break;
                        case 'folder':
                            if (is_dir($filepath) && $is_all == TRUE)
                            {
                                $files = array_merge($files,self::list_dir_info($filepath,$is_all,$exts,$sort));
                                array_push($files,$filepath);
                            }
                            elseif (is_dir($filepath))
                            {
                                array_push($files,$filepath);
                            }
                            break;
                        case 'file':
                            if (is_dir($filepath) && $is_all == TRUE)
                            {
                                $files = array_merge($files,self::list_dir_info($filepath,$is_all,$exts,$sort));
                            }
                            elseif (is_file($filepath))
                            {
                                array_push($files,$filepath);
                            }
                            break;
                        default:
                            if (is_dir($filepath) && $is_all == TRUE)
                            {
                                $files = array_merge($files,self::list_dir_info($filepath,$is_all,$exts,$sort));
                            }
                            elseif (preg_match("/\.($exts)/i",$filepath) && is_file($filepath))
                            {
                                array_push($files,$filepath);
                            }
                            break;
                    }

                    switch($sort)
                    {
                        case 'asc':
                            sort($files);
                            break;
                        case 'desc':
                            rsort($files);
                            break;
                        case 'nat':
                            natcasesort($files);
                            break;
                    }
                }
                closedir($fh);
                return $files;
            }
            else
            {
                return FALSE;
            }
        }

        /**
         * 返回指定路径的文件夹信息，其中包含指定路径中的文件和目录
         *
         * @param string $dir
         *
         * @return ArrayObject
         */
        public function dir_info($dir)
        {

            return scandir($dir);
        }

        /**
         * 判断目录是否为空
         *
         * @param string $dir
         *
         * @return boolean
         */
        public function is_empty($dir)
        {

            $handle = opendir($dir);
            while (($file = readdir($handle)) !== false)
            {
                if ($file != '.' && $file != '..')
                {
                    closedir($handle);
                    return true;
                }
            }
            closedir($handle);
            return false;
        }

        /**
         * 返回指定文件和目录的信息
         *
         * @param $file
         *
         * @return array
         */
        public function FileInfo($file)
        {

            if (!file_exists($file))
            {
                return ['error' => '路径错误或文件不存在!'];
            }
            $dir               = [];
            $dir['filename']   = basename($file);//返回路径中的文件名部分。
            $dir['onlyname']   = $this->onlyname(basename($file)); //返回路径中的文件名部分。
            $dir['pathname']   = realpath($file);//返回绝对路径名。
            $dir['owner']      = fileowner($file);//文件的 user ID （所有者）。
            $dir['perms']      = fileperms($file);//返回文件的 inode 编号。
            $dir['inode']      = fileinode($file);//返回文件的 inode 编号。
            $dir['group']      = filegroup($file);//返回文件的组 ID。
            $dir['path']       = dirname($file);//返回路径中的目录名称部分。
            $dir['atime']      = fileatime($file);//返回文件的上次访问时间。
            $dir['ctime']      = filectime($file);//返回文件的上次改变时间。
            $dir['perms']      = fileperms($file);//返回文件的权限。
            $dir['size']       = filesize($file);//返回文件大小。
            $dir['type']       = filetype($file);//返回文件类型。
            $dir['ext']        = is_file($file) ? pathinfo($file,PATHINFO_EXTENSION) : '';//返回文件后缀名
            $dir['mtime']      = filemtime($file);//返回文件的上次修改时间。
            $dir['isDir']      = is_dir($file);//判断指定的文件名是否是一个目录。
            $dir['isFile']     = is_file($file);//判断指定文件是否为常规的文件。
            $dir['isLink']     = is_link($file);//判断指定的文件是否是连接。
            $dir['isReadable'] = is_readable($file);//判断文件是否可读。
            $dir['isWritable'] = is_writable($file);//判断文件是否可写。
            $dir['isUpload']   = is_uploaded_file($file);//判断文件是否是通过 HTTP POST 上传的。
            return $dir;
        }

        /**
         * 获取文件目录下的
         *
         * @param $path
         *
         * @return array
         */
        static public function getPathDName($path)
        {

            $names = scandir($path);
            unset($names[0]);
            unset($names[1]);
            $name = [];
            foreach ($names as $item)
            {
                if (is_dir($path . $item))
                {
                    $name[] = $item;
                }
            }
            return $name;
        }

        /**
         * 或取文件名称-不含后缀
         * @param $name
         *
         * @return mixed
         */
        public function onlyname($name)
        {

            return explode('.',$name)[0];
        }

        /**
         * 返回关于打开文件的信息
         *
         * @param $file
         *
         * @return ArrayObject
         * 数字下标     关联键名（自 PHP 4.0.6）     说明
         * 0     dev     设备名
         * 1     ino     号码
         * 2     mode     inode 保护模式
         * 3     nlink     被连接数目
         * 4     uid     所有者的用户 id
         * 5     gid     所有者的组 id
         * 6     rdev     设备类型，如果是 inode 设备的话
         * 7     size     文件大小的字节数
         * 8     atime     上次访问时间（Unix 时间戳）
         * 9     mtime     上次修改时间（Unix 时间戳）
         * 10     ctime     上次改变时间（Unix 时间戳）
         * 11     blksize     文件系统 IO 的块大小
         * 12     blocks     所占据块的数目
         */
        public function open_info($file)
        {

            $file   = fopen($file,"r");
            $result = fstat($file);
            fclose($file);
            return $result;
        }

        /**
         * 改变文件和目录的相关属性
         *
         * @param string $file    文件路径
         * @param string $type    操作类型
         * @param string $ch_info 操作信息
         *
         * @return bool
         */
        public function change_file($file,$type,$ch_info)
        {

            $is_ok = false;
            switch($type)
            {
                case 'group' :
                    $is_ok = chgrp($file,$ch_info);//改变文件组。
                    break;
                case 'mode' :
                    $is_ok = chmod($file,$ch_info);//改变文件模式。
                    break;
                case 'ower' :
                    $is_ok = chown($file,$ch_info);//改变文件所有者。
                    break;
            }

            return $is_ok;
        }

        /**
         * 取得文件路径信息
         *
         * @param $path string  完整路径
         *
         * @return mixed
         */
        public function get_file_type($path)
        {

            $fileinfo = $this->FileInfo($path);

            return $fileinfo['pathname'];
        }

        /**
         * 取得上传文件信息
         *
         * @param $file file属性信息
         *
         * @return array
         */
        public function get_upload_file_info($file)
        {

            $file_info     = $_FILES[$file];//取得上传文件基本信息
            $info          = [];
            $info['type']  = strtolower(trim(stripslashes(preg_replace("/^(.+?);.*$/","\\1",$file_info['type'])),'"'));//取得文件类型
            $info['temp']  = $file_info['tmp_name'];//取得上传文件在服务器中临时保存目录
            $info['size']  = $file_info['size'];//取得上传文件大小
            $info['error'] = $file_info['error'];//取得文件上传错误
            $info['name']  = $file_info['name'];//取得上传文件名
            $info['ext']   = $this->get_ext($file_info['name']);//取得上传文件后缀
            return $info;
        }

        /**
         * 设置文件命名规则
         *
         * @param string $type     命名规则
         * @param string $filename 文件名
         *
         * @return string
         */
        public function set_file_name($type)
        {

            switch($type)
            {
                case 'hash' :
                    $new_file = md5(uniqid(mt_rand()));//mt_srand()以随机数md5加密来命名
                    break;
                case 'time' :
                    $new_file = time();
                    break;
                default :
                    $new_file = date($type,time());//以时间格式来命名
                    break;
            }
            return $new_file;
        }

        /**
         * 文件保存路径处理
         *
         * @return string
         */
        public function check_path($path)
        {

            return (preg_match('/\/$/',$path)) ? $path : $path . '/';
        }

        public function down_remote_file($url,$save_dir = '',$filename = '',$type = 0)
        {

            if (trim($url) == '')
            {
                return ['file_name' => '','save_path' => '','error' => 1];
            }
            if (trim($save_dir) == '')
            {
                $save_dir = './';
            }
            if (trim($filename) == '')
            {//保存文件名
                $ext = strrchr($url,'.');
                //    if($ext!='.gif'&&$ext!='.jpg'){
                //        return array('file_name'=>'','save_path'=>'','error'=>3);
                //    }
                $filename = time() . $ext;
            }
            if (0 !== strrpos($save_dir,'/'))
            {
                $save_dir .= '/';
            }
            //创建保存目录
            if (!file_exists($save_dir) && !mkdir($save_dir,0777,true))
            {
                return ['file_name' => '','save_path' => '','error' => 5];
            }
            //获取远程文件所采用的方法
            if ($type)
            {
                $ch      = curl_init();
                $timeout = 5;
                curl_setopt($ch,CURLOPT_URL,$url);
                curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
                curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
                $img = curl_exec($ch);
                curl_close($ch);
            }
            else
            {
                ob_start();
                readfile($url);
                $img = ob_get_contents();
                ob_end_clean();
            }
            //$size=strlen($img);
            //文件大小
            $fp2 = fopen($save_dir . $filename,'a');

            fwrite($fp2,$img);
            fclose($fp2);
            unset($img,$url);
            return ['file_name' => $filename,'save_path' => $save_dir . $filename,'error' => 0];
        }

        /**
         * 获取目录下面的文件名以及子目录下的文件名
         *
         * @param $dir
         *
         * @return array
         */
        static function getDir($dir)
        {

            $data = [];
            self::searchDir($dir,$data);
            return $data;
        }

        static function searchDir($path,&$data)
        {

            if (is_dir($path))
            {
                $dp = dir($path);
                while ($file = $dp->read())
                {
                    if ($file != '.' && $file != '..')
                    {
                        self::searchDir($path . '/' . $file,$data);
                    }
                }
                $dp->close();
            }
            if (is_file($path))
            {
                $data[] = $path;
            }
        }

    }